package net.huashitong.ssydt.provider.article.service;


import net.huashitong.ssydt.PaginationResult;
import net.huashitong.ssydt.article.entity.SsArticleArticle;
import net.huashitong.ssydt.article.entity.vo.ArticleArticleInVO;
import net.huashitong.ssydt.article.entity.vo.ArticleArticleOutVO;
import net.huashitong.ssydt.article.entity.vo.ArticleArticleQueryInVO;
import net.huashitong.ssydt.article.entity.vo.ArticleListInVO;

import java.util.List;

/**
 * @author <a href="mailto:yhy23456@163.com">huiyang.yu</a>
 * @since 2017.09.14
 */
public interface SsArticleArticleService {

    int deleteByPrimaryKey(Long id);

    int insert(SsArticleArticle record);

    int insertSelective(SsArticleArticle record);

    SsArticleArticle selectByPrimaryKey(Long id);

    int updateByPrimaryKeySelective(SsArticleArticle record);

    int updateByPrimaryKey(SsArticleArticle record);

    List<SsArticleArticle> query(ArticleListInVO articleListInVO);

    /**
     * 加载文章对象，无则抛出异常
     *
     * @param id 文章ID
     * @return SsArticleArticle 文章
     */
    SsArticleArticle getById(Long id);

    /**
     * 分页查询文章列表
     *
     * @param articleQueryInVO 分页查询条件
     * @return PaginationResult 分页查询结果
     */
    PaginationResult<SsArticleArticle> paginationQuery(ArticleArticleQueryInVO articleQueryInVO);

    /**
     * 加载文章基本信息与内容
     *
     * @param articleId 文章ID
     * @return ArticleArticleOutVO 文章数据
     */
    ArticleArticleOutVO getArticle(Long articleId);

    /**
     * 新增文章
     *
     * @param articleArticleInVO 文章数据
     */
    Long addArticle(ArticleArticleInVO articleArticleInVO);

    /**
     * 修改文章
     *
     * @param articleArticleInVO 文章数据
     */
    void updateArticle(ArticleArticleInVO articleArticleInVO);

    /**
     * 删除文章
     *
     * @param articleId 文章ID
     */
    void deleteArticle(Long articleId);

    /**
     * <p>最近三条记录</p>
     * <p>显示3篇，包括：同分类下的“下一篇文章”、“上一篇文章”“上上篇文章”</p>
     * <p>对于第一篇和最后一篇，显示同分类临近的其他几篇文章，没有相同分类的文章则不显示“相关资讯”</p>
     *
     * @param ssArticleArticle
     * @return
     */
    List<SsArticleArticle> queryLatelyThreeByIdWithArticleTypeId(SsArticleArticle ssArticleArticle);

    /**
     * 点击数自增 +1
     *
     * @param id
     */
    int incrementClickNumber(Long id);

    /**
     * 评论数 + number
     *
     * @param id
     * @param number
     * @return
     */
    int incrementCommentNumber(Long id, int number);

    /**
     * 热度数 + number
     *
     * @param id
     * @param number
     * @return
     */
    int incrementHotNumber(Long id, long number);

    /**
     * 点击数自增 和 热度数增加
     *
     * @param ssArticleArticle
     */
    void updateClickNumberAndHotNumber(Long ssArticleArticle);

    /**
     * 点赞数自增
     *
     * @param articleId
     */
    int incrementPraiseNumber(Long articleId);

    /**
     * 点赞数 +  number
     *
     * @param articleId
     */
    int incrementPraiseNumber(Long articleId, int number);
}
